package d2_buffer_stream;

import java.io.*;

public class TimeTest05 {
    //准备大文件的路径--->使用常量记性记忆
    public static final String SRC_VIDEO = "D:\\javadevelop\\2024班\\02阶段java基础进阶\\第一天作业视频.avi";
    //目标路径
    public static final String DEST_PATH = "D:\\javadevelop\\2024班\\02阶段java基础进阶\\陈某总结\\";

    public static void main(String[] args) {
        // 目标: 原始流和缓冲流的性能分析(独立功能,独立成方法)

        //进行调用
        //第一个,要进行太多次的系统调用
        //copy01(); // 使用低级的字节按照一个一个字节的形式复制文件: 简直慢的令人发指(丧心病狂), 直接淘汰, 禁止使用
        copy02();// 使用低级的字节流按照字节数组形式复制文件, 还可以, 但是相对比较慢
        //copy03();//使用高级缓冲字节流按照一个一个字节的形式复制文件: 还是比较慢, 不推荐使用
        copy04();// 使用高级的缓冲字节流按照字节数组的形式复制文件: 极快! 推荐使用


    }

    //4、使用高级的缓冲字节流按照字节数组的形式复制文件。
    public static void copy04() {
        //使用System的时间记录时间
        long start = System.currentTimeMillis();
        //目标: 使用字节缓冲输入提升原始字节流读写数据的性能
        try (
                //这里只能放置资源对象, 用完之后自动调用资源的close方法关闭资源
                //1、创建一个字节输入流: 文件读取到内存中来
                InputStream fIs = new FileInputStream(
                        SRC_VIDEO);
                //使用高级的缓冲字节输入流包装低级的字节输入流
                BufferedInputStream bis = new BufferedInputStream(fIs);
                //2、创建一个字节输出流: 用于将内存在的字节进行写到文件中
                OutputStream fOs = new FileOutputStream(
                        DEST_PATH + "小花朵.avi");
                //使用高级的缓冲字节输出流包装低级的字节输出流
                OutputStream bos = new BufferedOutputStream(fOs)
        ) {

            //创建一个字节数组 --> 桶
            byte[] buffer = new byte[32*1024];// 加大buffer  -->不是越大就越好, 一般到32*1024即可

            //4、转移数据
            int len;
            while ((len = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, len);//读多少倒多少
            }
            System.out.println("复制完成");
        } catch (Exception e) {//捕获一切异常
            e.printStackTrace();//打印堆栈的信息
        }
        long end = System.currentTimeMillis();
        System.out.println("使用高级的缓冲字节流按照一个一个字节的形式复制文件的耗时:" + (end - start) / 1000.0 + "s");

    }

    //3、使用高级的缓冲字节流按照一个一个字节的形式复制文件。
    public static void copy03() {
        //使用System的时间记录时间
        long start = System.currentTimeMillis();
        //目标: 使用字节缓冲输入提升原始字节流读写数据的性能
        try (
                //这里只能放置资源对象, 用完之后自动调用资源的close方法关闭资源
                //1、创建一个字节输入流: 文件读取到内存中来
                InputStream fIs = new FileInputStream(
                        SRC_VIDEO);
                //使用高级的缓冲字节输入流包装低级的字节输入流
                BufferedInputStream bis = new BufferedInputStream(fIs);
                //2、创建一个字节输出流: 用于将内存在的字节进行写到文件中
                OutputStream fOs = new FileOutputStream(
                        DEST_PATH + "小花朵.avi");
                //使用高级的缓冲字节输出流包装低级的字节输出流
                OutputStream bos = new BufferedOutputStream(fOs)
        ) {


            //4、转移数据
            int b;
            while ((b = bis.read()) != -1) {
                bos.write(b);
            }
            System.out.println("复制完成");
        } catch (Exception e) {//捕获一切异常
            e.printStackTrace();//打印堆栈的信息
        }
        long end = System.currentTimeMillis();
        System.out.println("使用高级的缓冲字节流按照一个一个字节的形式复制文件的耗时:" + (end - start) / 1000.0 + "s");

    }

    //2、使用低级的字节流按照字节数组的形式复制文件。
    public static void copy02() {
        //使用System的时间记录时间
        long start = System.currentTimeMillis();
        try (
                //这里只能放置资源对象, 用完之后自动调用资源的close方法关闭资源
                //1、创建一个字节输入流: 文件读取到内存中来
                InputStream fIs = new FileInputStream(
                        SRC_VIDEO);
                //2、创建一个自己输出流: 用于将内存在的字节进行写到文件中
                OutputStream fOs = new FileOutputStream(
                        DEST_PATH + "小花朵.avi");
        ) {

            //创建一个字节数组-->其实也是在存中的,也是相当于一个缓冲的桶
            byte[] buffer = new byte[32*1024];

            //4、转移数据
            int len;
            while ((len = fIs.read(buffer)) != -1) {
                fOs.write(buffer, 0, len);//读多少倒多少
            }
            System.out.println("复制完成");
        } catch (Exception e) {//捕获一切异常
            e.printStackTrace();//打印堆栈的信息
        }

        long end = System.currentTimeMillis();
        System.out.println("使用低级的字节流按照字节数组的形式复制文件的耗时:" + (end - start) / 1000.0 + "s");
    }

    //1、使用低级的字节流按照一个一个字节的形式复制文件。
    public static void copy01() {
        //使用System的时间记录时间
        long start = System.currentTimeMillis();
        try (
                //这里只能放置资源对象, 用完之后自动调用资源的close方法关闭资源
                //1、创建一个字节输入流: 文件读取到内存中来
                InputStream fIs = new FileInputStream(
                        SRC_VIDEO);
                //2、创建一个自己输出流: 用于将内存在的字节进行写到文件中
                OutputStream fOs = new FileOutputStream(
                        DEST_PATH + "小花朵.avi");
        ) {


            //4、转移数据
            int b;
            while ((b = fIs.read()) != -1) {
                fOs.write(b);
            }
            System.out.println("复制完成");
        } catch (Exception e) {//捕获一切异常
            e.printStackTrace();//打印堆栈的信息
        }

        long end = System.currentTimeMillis();
        System.out.println("使用低级的字节流按照一个一个字节的形式复制文件的耗时:" + (end - start) / 1000.0 + "s");
    }

}


